﻿using System;
using System.ComponentModel;
using Brjnk.MVVM;

namespace Brjnk.GpxExplorer.Data
{
    public abstract class TrackSegment : INotifyPropertyChanged, ICloneable
    {
        // Při upravování této třídy musí být nové vlástnosti přidány do metody ConvertTo
        // Metoda ConvertTo zajišťuje konverzi mezi různými potomky této třídy (např. pokud jsou data z různých zdrojů / typů souboru)
        // Metoda ConvertTo zkopíruje vlastnosti definované touto třídou

        private ObservableCollectionEx<TrackPoint> points;

        public ObservableCollectionEx<TrackPoint> Points
        {
            get { return points; }
            protected set { points = value; OnPropertyChanged("Points"); }
        }

        public T ConvertTo<T>() where T : TrackSegment
        {
            var instance = Activator.CreateInstance(typeof(T)) as TrackSegment;
            this.CloneItems(instance);
            return instance as T;
        }

        private void CloneItems(TrackSegment instance)
        {
            instance.Points = new ObservableCollectionEx<TrackPoint>();
            foreach (var item in Points)
            {
                instance.Points.Add((TrackPoint)item.Clone());
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public abstract object Clone();
    }
}